package com.udima.reglocation.util;
 
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;

/**
 * Clase para gestionar el posicionamiento vía GPS /WIFI
 * 
 * Configura y realiza la conexión correspondiente y alerta en el caso de que no exista ningún
 * dispositivo activo que permita obtener la posición, redirigiendo al usuario a la pantalla de configuración si lo desea
 * 
 * @author luis
 *
 */

public class GPSTracker extends Service implements LocationListener {
 
    private final Context mContext;
 
    // flag para el estado del dispositivo GPS
    boolean isGPSEnabled = false;
 
    // flag para el estado de la red
    boolean isNetworkEnabled = false;
 
    // flag para el estado del GPS
    boolean canGetLocation = false;
 
    Location location; // localización
    double latitude;  // latitud
    double longitude; // longitud
 
    // La distancia mínima para realizar actualizaciones en metros
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 1 metro
 
    // El tiempo mínimo entre actualizaciones en milisegundos
    private static final long MIN_TIME_BW_UPDATES = 1; // 1 segundo
 
    // Declaración de un Location Manager
    protected LocationManager locationManager;
 
    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }
 
    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);
 
            // Obteniendo el estado del GPS
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
 
            // obteniendo el estado de la red
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
 
            if (!isGPSEnabled && !isNetworkEnabled) {
                // En este caso ninguno de los dos está habilitado
            } else {
                this.canGetLocation = true;
                // Primero se obtiene la localización del proveedor de red si se puede
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // Si el GPS está habilitado, se obtienen las coordenadas usando los servicios de este
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return location;
    }
     
    /**
     * Parada en el uso de servicios GPS
     * La llamada a esta función detiene el uso del dispositivo GPS en la aplicación
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }       
    }
     
    /**
     * Función para obtener la latitud
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }
         
        // devuelve la latitud
        return latitude;
    }
     
    /**
     * Función para obtener la longitud
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }
         
        // devuelve la longitud
        return longitude;
    }
     
    /**
     * Función que comprueba si el GSP/WIFI está activado
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }
     
    /**
     * Función que muestra la ventana de alerta de configuración del GPS
     * Al pulsar el botón de configuración se redirige al usuario a la pantalla de configuración
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
      
        // Título de la alerta
        alertDialog.setTitle("Configuración del GPS");
  
        // Mensaje de la alerta
        alertDialog.setMessage("El dispositivo GPS no está habilitado. ¿Desea ir a la pantalla de configuración?");
  
        // Acción tras pulsar el botón de configuración
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });
  
        // Acción tras pulsar el botón de cancelar
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });
  
        // Se muestra el mensaje de alerta
        alertDialog.show();
    }
 
    @Override
    public void onLocationChanged(Location location) {
    	if(location != null)
    	{
	    	this.location = location;
	    	latitude  = location.getLatitude();
	    	longitude = location.getLongitude();
    	}
    }
 
    @Override
    public void onProviderDisabled(String provider) {
    }
 
    @Override
    public void onProviderEnabled(String provider) {
    }
 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
 
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
 
}